#include "ros/ros.h"    // 引用ROS中大部分常用的头文件
#include "std_msgs/String.h"    /* 由String.msg文件自动生成的头文件
std_msgs/String
std_msgs package 中 */
#include <sstream>

int main(int argc, char **argv){
    ros::init(argc, argv, "talker");    /* 初始化ROS。
    通过命令行进行名称重映射，
    也可以指定节点的名称，
    运行过程中节点的名称必须唯一。 */
    ros::NodeHandle n;  // 为进程节点创建句柄

    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
    /* 
    NodeHandle::advertise()：返回一个ros::Publisher对象
    第一个参数chatter：在chatter(话题名)上发布std_msgs/String类型的消息，
    于是master（节点管理器）便会告诉所有订阅了chatter话题的节点，将要由数据发布。
    第二个参数：发布序列大小 */

    ros::Rate loop_rate(10);    // 指定自循环频率，该语句以10Hz频率运行

    float count = 0.1;
    while(ros::ok()){
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello world " << count;
        msg.data = ss.str();
        /* 使用一个由msg file文件产生的“消息自适应”类在ROS网络中广播消息。它只有一个数据成员“data” */
        
        ROS_INFO("%s", msg.data.c_str());    // 可代替printf/cout等函数

        chatter_pub.publish(msg);   // 向所有订阅chatter话题的节点发送消息

        ros::spinOnce();

        loop_rate.sleep();  // 调用ros::Rate对象来休眠一段时间以使得发布频率为10Hz
        count+=0.1;
    }
    
    return 0;
}
